package inner_class.anonymous_inner_class;

/**
 * @Package: inner_class.anonymous_inner_class
 * @ClassName: AnonymousInnerClass
 * @Author: x2606
 * @CreateTime: 2022/3/12 12:02
 * @Description: 匿名内部类
 */

public class AnonymousInnerClass {
    public static void main(String[] args) {
        Outer outer = new Outer();
        outer.fun();
    }
}

class Outer{
    private  int n = 10;
    public void fun(){
        //基于接口的匿名内部类
        //创建匿名内部类，实现接口;匿名内部类创建对象实例后，类销毁，实例保留。
        // cat编译类型=接口类型，cat运行类型=匿名内部类。
         Animal cat= new Animal(){
             @Override
             public void cry() {
                 System.out.println("小猫哭。。。");
             }
         };
         cat.cry();
         //系统为匿名内部类分配的名字时 外部类类名$1,
        System.out.println("cat的运行类型="+ cat.getClass());

        //基于普通类的匿名内部类
        //系统创建了一个匿名内部类继承了Person类，类名 外部类类名$2，
//        class Outer$2 extends Person{
//            @Override
//            public void say() {
//                System.out.println("hello");
//            }
//        }


        Person jack= new Person("jack"){
            @Override
            public void say() {
                System.out.println("匿名内部类重写了say方法1111");
            }
        };
        jack.say();
        System.out.println("jack的运行类型="+ jack.getClass());

        //匿名内部类同时也是对象
        new Person("jack"){
            @Override
            public void say() {
                System.out.println("匿名内部类重写了say方法2222");
            }
        }.say();
    }
}

interface Animal{
    public void cry();
}

class Person{
    private String string;

    public Person(String string) {
        this.string = string;
    }
    public void say(){}
}
